frontend/pages/api/nauth/[...nextauth].js (view raw)
1import NextAuth from 'next-auth';
2import CredentialsProvider from 'next-auth/providers/credentials';
3import GoogleProvider from 'next-auth/providers/google';
4
5const {STRAPI_URL = 'http://localhost:1337'} = process.env;
6
7const authHandler = NextAuth({
8 providers: [
9 CredentialsProvider({
10 name: 'magic-link',
11 credentials: {
12 token: {label: 'Token', type: 'password'},
13 },
14 async authorize(credentials) {
15 const response = await fetch(`${STRAPI_URL}/api/auth/magic-link`, {
16 method: 'POST',
17 headers: {'Content-Type': 'application/json'},
18 body: JSON.stringify({
19 token: credentials.token,
20 }),
21 });
22 const data = await response.json();
23 if (!data?.jwt) return null;
24 else {
25 const {user, jwt} = data;
26 return {...user, jwt};
27 }
28 },
29 }),
30 GoogleProvider({
31 clientId: process.env.GOOGLE_CLIENT_ID,
32 clientSecret: process.env.GOOGLE_CLIENT_SECRET,
33 }),
34 ],
35 session: {
36 jwt: true,
37 },
38 callbacks: {
39 jwt: async params => {
40 const {token, user, account} = params;
41
42 // Google Auth
43 if (account?.provider === 'google') {
44 const response = await fetch(
45 `${STRAPI_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`
46 );
47 const data = await response.json();
48
49 if (data.error) {
50 console.error(
51 `Error from Strapi on authentication with Google: `,
52 data.error
53 );
54 throw new Error(data.error?.message || data.error);
55 }
56
57 token.id = data.user.id;
58 token.jwt = data.jwt;
59 token.email = data.user.email;
60 token.username = data.user.name;
61 token.lang = data.user.lang?.toLowerCase();
62 token.provider = account.provider;
63 }
64
65 // Strapi Auth
66 else if (user) {
67 token.id = user.id;
68 token.jwt = user.jwt;
69 token.email = user.email;
70 token.username = user.firstname;
71 token.lang = user.lang?.toLowerCase();
72 token.provider = account.provider;
73 }
74
75 return token;
76 },
77 session: async params => {
78 const {session, token} = params;
79 if (session) {
80 try {
81 const response = await fetch(`${STRAPI_URL}/api/users/me`, {
82 headers: {
83 'Content-Type': 'application/json',
84 Authorization: `Bearer ${token.jwt}`,
85 },
86 });
87 const profile = await response.json();
88 session.profile = profile;
89 } catch (error) {
90 console.error(error);
91 }
92
93 session.token = token;
94 session.user.name = token.username;
95 session.user.lang = token.lang;
96 }
97 return session;
98 },
99 },
100 pages: {
101 signIn: '/auth/login',
102 error: '/auth/login',
103 },
104});
105
106export default async function handler(...params) {
107 await authHandler(...params);
108}